//======================================================================
//文件名称：spi.h
//功能概要：SPI底层驱动构件头文件
//芯片类型：STM32F103C8T6
//版权所有：江苏电子-索明何
//版本更新：2023-12-10  V1.1
//======================================================================
#ifndef  _SPI_H               //防止重复定义（开头）
#define  _SPI_H

//1.头文件包含
#include  "common.h"          //包含公共要素软件构件头文件

//2.宏定义
//(1)SPI号宏定义
#define  SPI_1    0
#define  SPI_2    1

//(2)SPI主模式、从模式选择宏定义
#define  SPI_SLAVE    0     //从模式
#define  SPI_MASTER   1     //主模式

//(3)SPI使用的引脚宏定义（由具体硬件板决定）
#define  SPI1_GROUP   2     //SPI_1: 1=PTA4-NSS、 PTA5-SCK、 PTA6-MISO、 PTA7-MOSI
                            //       2=PTA15-NSS、PTB3-SCK、 PTB4-MISO、 PTB5-MOSI
#define  SPI2_GROUP   1     //SPI_2: 1=PTB12-NSS、PTB13-SCK、PTB14-MISO、PTB15-MOSI

//3.对外接口函数声明
//======================================================================
//函数名称：spi_init
//函数功能：对指定的SPI进行初始化（全双工通信）
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参）
//          master_slave: 主/从模式选择（可用宏定义SPI_MASTER或SPI_SLAVE作为函数实参）
//          baud_rate:    波特率，建议使用250、500、1000、2000、4000、8000、16000（kbit/s）
//          CPOL: 时钟极性（0或1，分别表示时钟在空闲时为低电平或高电平）
//          CPHA: 时钟相位（0或1，分别表示在第1个或第2个时钟边沿捕获数据）
//函数返回：无
//相关说明：SPI主从器件必须使用相同的时钟极性和相位值，才能正常通信
//函数调用示例：
//   spi_init(SPI_1, SPI_MASTER, 500, 0, 0);  //将SPI1初始化为主模式，波特率为500kbit/s
//   spi_init(SPI_2, SPI_SLAVE, 500, 0, 0);   //将SPI2初始化为从模式，波特率为500kbit/s
//======================================================================
void spi_init(uint8 SPIx, uint8 master_slave, uint32 baud_rate, uint8 CPOL, uint8 CPHA);

//======================================================================
//函数名称：spi_send1
//函数功能：从指定的SPI发送1个字符
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参） 
//          send_data: 待发送的字符
//函数返回：1表示发送成功，0表示发送失败
//函数调用示例：
//    spi_send1(SPI_2, 'A');      //通过SPI2发送1个字符 'A'
//======================================================================
uint8 spi_send1(uint8 SPIx, uint8 send_data);

//======================================================================
//函数名称：spi_sendN
//函数功能：从指定的SPI发送多个字符
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参）
//          n:     待发送的字符个数（1~65535）
//          *buff: 用于指向发送缓冲区的首地址（可用实参数组名或指针变量作为函数实参）
//函数返回：1表示发送成功，0表示发送失败
//函数调用示例：
//    spi_sendN(SPI_2, 10, str);  //通过SPI2发送字符数组str中的前10个字符
//    spi_sendN(SPI_2, 10, ps);   //通过SPI2发送指针变量ps所指向的字符串中的前10个字符
//======================================================================
uint8 spi_sendN(uint8 SPIx, uint16 n, uint8 *buff);

//======================================================================
//函数名称：spi_recv1
//函数功能：从指定的SPI接收1个字符，同时清除接收中断标志
//函数参数：SPIx:  SPI号（可用宏定义SPI_1或SPI_2作为函数实参）
//          *re_flag: 用于传回接收状态的标志（1表示接收成功，0表示接收失败）
//                 （可用实参变量的地址作为函数实参，使实参变量获取接收状态标志值）
//函数返回：接收到的字符
//函数调用示例：
//  通过SPI1接收1个字符，赋给字符变量re_data，并将接收状态标志值传给实参变量flag
//  re_data = spi_recv1(SPI_1, &flag); 
//======================================================================
uint8 spi_recv1(uint8 SPIx, uint8 *re_flag);

//======================================================================
//函数名称：spi_recvN
//函数功能：从指定的SPI接收多个字符
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参）
//          n:     接收字符的个数（1~65535）
//          *buff: 用于指向接收缓冲区的首地址（可用实参数组名作为函数实参）
//函数返回：1表示接收成功，0表示接收失败
//函数调用示例：
//    spi_recvN(SPI_1, 10, str);    //通过SPI1接收10个字符，存入字符数组str中
//======================================================================
uint8 spi_recvN(uint8 SPIx, uint16 n, uint8 *buff);

//======================================================================
//函数名称：spi_recv_int_enable
//函数功能：使能指定SPI的接收中断
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参）
//函数返回：无
//函数调用示例：
//   spi_recv_int_enable(SPI_1);     //使能SPI1接收中断
//======================================================================
void spi_recv_int_enable(uint8 SPIx);

//======================================================================
//函数名称：spi_recv_int_disable
//函数功能：禁止指定SPI的接收中断
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参） 
//函数返回：无
//函数调用示例：
//   spi_recv_int_disable(SPI_1);     //禁止SPI1接收中断
//======================================================================
void spi_recv_int_disable(uint8 SPIx);

//======================================================================
//函数名称：spi_recv_int_get
//函数功能：获取指定SPI的接收中断标志
//函数参数：SPIx: SPI号（可用宏定义SPI_1或SPI_2作为函数实参）
//函数返回：1表示有接收中断，0表示无接收中断
//函数调用示例：
//    spi_recv_int_get(SPI_1);       //获取SPI1的接收中断标志
//======================================================================
uint8 spi_recv_int_get(uint8 SPIx);

#endif           //防止重复定义（结尾）
